package s.k.gui.webtest.data.provider;

import java.io.FileInputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;

public class SimpleExcelDataProvider implements Iterator<Object[]>{
	
	private ExcelDataTools data;
	private Sheet sheet;
	@SuppressWarnings("unused")
	private Row row;
	//含有数据的总行数
	private int dataRows;
	//总的数据行数
	private int rows;
	//数据要读取的当前行
	private int curRow=1;
	private Object[] columnName;
	//总的cell数
	private int columnNum;
	/**
	 * ExcelDataProvider的构造方法，加入配置文件的话，可以指定需要配置的xls文件的地址，并且指定了文件的名和sheet名字<br>
	 * className则是文件的名字，在调用中实现去掉包名，sheet赋值默认为方法的名字<br>
	 * 通过遍历输出定义好的参数属性名称，并且打印出来。<br>
	 * 默认的xls文件的目录在D:\className.xls里面的sheet下
	 * */
	public  SimpleExcelDataProvider(String className,String methodName){
		try{
			data=new ExcelDataTools();
			this.sheet=data.getExcel(new FileInputStream(data.getPathBycontains("D:\\",className))).getSheet(methodName);
			System.out.println("数据文件在系统的d:\\"+className+".xls的位置");
			data.setSheet(sheet);
			data.setRow(data.getRow(0));
			this.rows=data.getAllRows().size();
			this.dataRows=rows;
			System.out.println("总共有"+rows+"行！");
			System.out.println("有值的总行数为"+dataRows);
			this.columnNum=data.getAllcellsByRow().size();
			System.out.println("总共有"+columnNum+"个参数化的字段");
			columnName = new String[columnNum];
			for(int i=0;i<columnNum;i++){
				data.setCell(data.getAllcellsByRow().get(i));
				System.out.println("Excel字段的属性：");
				columnName[i]=data.getData(i);
			}		
			System.out.println("-------------构造数据驱动完毕！------------");
		}catch(Exception e){
			System.out.println("数据驱动初始化失败了！");
			e.printStackTrace();		
		}
	}
	@Override
	public boolean hasNext() {
		/***获取含有数据的总行数，把空白的行去掉，迭代的时候绕过。
		 * 要保证自动化的话，休要修改目前的工具类，需要把迭代器的空白行去掉，所以需要做内部处理<br>
		 * 先把迭代器放进一个list中，然后再去迭代这个list返回真正的迭代器。或者直接存储到list中<br>
		 *然后把list转化成迭代器。下一版本实现这功能，目前的确定对有空白行的excel的支持不好
		 * */
//		for(int i=0;i<rows;i++){
//			data.setRow(data.getRow(i));
//			if(data.getCell(0)==null){
//				data.setCell(data.getCell(0));
//				data.setValue("");
//			}else{
//				data.setCell(data.getCell(0));
//				if(data.getData()==null||((String)data.getData()).replaceAll(" ","")==""){
//					dataRows=dataRows-1;
//					System.out.println(dataRows);
//				}
//			}
//		}
		if(this.rows==0||curRow>=this.dataRows){
			return false;
		}else{
			return true;
		}
	}

	@Override
	public Object[] next() {
		/**注入row的属性*/
		data.setRow(data.getRow(this.curRow));
		Map<Object,Object> s = new HashMap<Object,Object>();
		/*当在当前row的时候进行赋值处理，如果超过了队列的index，则抛出异常，抓住异常，并且赋值为空*/
		for(int i=0;i<this.columnNum;i++){
			Object temp="";
			try{
				data.setCell(data.getAllcellsByRow().get(i));
				temp=data.getData();
			}catch(IndexOutOfBoundsException e){
				temp="";
			}
			if(temp!="")
				s.put(this.columnName[i],temp );
		}
		/**把map存在一个数组里面，和testng的参数的格式对应*/
		Object r[]=new Object[1];
		r[0]=s;
		this.curRow++;	
		return r;
	}

	/**暂时无法实现的方法*/
	@Override
	public void remove() {
		try {
			throw new Exception("不支持remove的方法！");
		} catch (Exception e) {
			
			e.printStackTrace();
		}
	}

}
